iT邦幫忙

0

Day27 | 遊戲開發(六)

  • 分享至 

  • xImage
  •  

在前面的單元中,我們成功讓棋盤具備了互動與輪流下棋的功能。今天我們要讓連成一線時(橫向)停止遊戲。


  • 新增 gameOver 狀態控管
    首先,我們在類別成員變數中加入一個布林值:boolean gameOver = false; // 預設遊戲未結束
    在 actionPerformed 監聽器中,我們做了兩處重要的防呆與流程控制:
  1. 點擊前檢查:如果 gameOver 為 true,直接 return 阻斷,不讓玩家繼續點擊棋盤。
  2. 獲勝後不切換玩家:呼叫 checkWinner() 後,只有在 !gameOver(遊戲未結束)的情況下才切換玩家與提示文字。
tile.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e){
        if (gameOver) return; // 遊戲若已結束,直接攔截點擊

        JButton tile = (JButton)e.getSource();
        if (tile.getText() == ""){
            tile.setText(currentPlayer);
            checkWinner(); // 檢查是否有玩家獲勝

            // 只有在遊戲尚未結束時,才切換到下一位玩家
            if (!gameOver){
                currentPlayer = currentPlayer == playerX ? playerO : playerX;
                textLabel.setText(currentPlayer + "'s turn.");
            }
        }
    }
});
  • 核心邏輯:checkWinner() 水平連線檢查
    接著,我們建立 checkWinner() 方法,並使用一個 for 迴圈遍歷三列(Row 0~2):
void checkWinner() {
    // 水平方向檢查 (Horizontal)
    for (int r = 0; r < 3; r++) {
        // 1. 若該列第一個格子是空的,代表這列不可能連線,直接跳過 (continue)
        if (board[r][0].getText() == "") continue;

        // 2. 檢查該列的第一格、第二格與第三格內容是否完全相同
        if (board[r][0].getText() == board[r][1].getText() && 
            board[r][1].getText() == board[r][2].getText()){
            
            gameOver = true; // 判定有玩家獲勝,鎖定遊戲
            return;
        }
    }
}

說明:

* if (board[r][0].getText() == "") continue;:這是一個很聰明的效能優化!如果第一格是空的,就不用去比較後面的格子,直接跳下一列檢查。
* getText() 連續相等比較:透過 board[r][0] == board[r][1] && board[r][1] == board[r][2] 遞移律,確定三個格子填入的是同一個玩家的符號(X 或 O)。
* 成功鎖定狀態:一旦發現三連線,立即將 gameOver 設為 true 並退出方法。
  • 讓獲勝的格子「變色」,並在頂部標題宣告贏家:
void setWinner(JButton tile) {
    tile.setForeground(Color.green);                    // 將字體顏色改為亮綠色
    tile.setBackground(Color.gray);                     // 將按鈕背景改為灰色
    textLabel.setText(currentPlayer + " is the winner!"); // 在頂端標題宣告獲勝者
}
  • 跑出來長這樣:
    https://ithelp.ithome.com.tw/upload/images/20261018/20184397JErF9VPdMk.png
    *說明:X連成橫向一直線了,所以遊戲停止,並宣告獲勝者。

  • 參考教學影片:https://youtu.be/Nc77ymnm8Ss?si=tvWAj3hiuhb38JPx


*提醒邦友,使用第三方服務/API 時,請務必評估資安風險與隱私保護
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言